我們將討論如何在 Android 應用程序中讀取照片。這是一個常見的任務,許多應用程序需要允許用戶選擇圖像,上傳圖片,或者只是在應用程序中顯示圖像。我們將介紹幾種方法來實現這個功能。
在許多情況下,您可能希望讓用戶選擇他們自己的圖片。這可以通過 Android 的 Intent 機制實現。以下是一個簡單的示例,演示如何啟動圖像選擇 Intent 並處理所選圖像。
// 在您的 Activity 中啟動圖像選擇 Intent
private Button btn_picker;
private ImageView imageView;
private ContentResolver resolver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_picker=(Button) findViewById(R.id.button);
imageView=(ImageView) findViewById(R.id.imageView);
resolver=this.getContentResolver();
btn_picker.setOnClickListener(view->{
//打開相簿
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
//選擇相片後接回傳
startActivityForResult(intent, 1);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Uri uri=data.getData();
try {
Bitmap bitmap= BitmapFactory.decodeStream(resolver.openInputStream(uri));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
這種方法允許用戶選擇他們的圖像,然後將所選圖像的 URI 返回給應用程序。您可以使用這個 URI 來讀取圖像,並進行進一步的處理。
在 onCreate 方法中設置了按鈕的點擊監聽器,當按鈕被點擊時,執行 takePhoto 方法,該方法用於處理拍照操作,包括設置檔案名稱、啟動相機應用程序等等。剩餘的詳細實現細節可以在 takePhoto 方法中完成。
private Button button;
private ImageView imageView;
private Uri uri;
private String fileName;
private final static int CAMARA_CODE = 500;
private final static int PERMISSION_REQUEST_CODE = 0;
private final String[] permissions = new String[]{
// 所需的權限:讀取外部儲存、寫入外部儲存、相機
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化介面元素
imageView = (ImageView) findViewById(R.id.imageView);
button = (Button) findViewById(R.id.button);
// 如果運行的 Android 版本 >= 6.0(API 23),需要請求必要的權限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions, PERMISSION_REQUEST_CODE);
}
// 設定按鈕的點擊監聽器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
camara();
}
});
}
}
這個程式碼的主要功能是拍攝照片,它簡化了生成檔案名稱、檢查目錄和創建照相Intent的過程。當按下按鈕時,它將生成一個以當前時間命名的檔案名稱,確保唯一性,然後檢查並建立照片存儲目錄。最後,它創建一個照相Intent,並指定了照片的輸出位置。
private void camara() {
//圖片名稱,用時間格式(年月日時分秒)來命名,這樣的命名,就不會重覆的情況。
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(System.currentTimeMillis());
fileName = format.format(date);
//創建目錄的路徑。
String path =Environment.getExternalStorageDirectory().getPath()+"/Documents";
//New出檔案路徑的File
File saveImage = new File(path,fileName+".jpg");
//先判斷是否有此檔案,再建立文字檔
if (!saveImage.exists()) {
try {
saveImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
else Log.e("note", "existsDir" );
//將File對像轉換為Uri並啟動照相程序
uri = FileProvider.getUriForFile(this, Environment.getExternalStorageDirectory().getPath()+"/Documents" , saveImage);
//啟動照相功能
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//指定圖片輸出地方。
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
//拍完照startActivityForResult() 結果返回onActivityResult() 函數
startActivityForResult(intent,CAMARA_CODE);
}
這段程式碼的作用是處理從相機拍攝照片後的回傳結果,並將照片顯示在應用程式的介面上。它包括解碼照片、旋轉照片以及顯示照片的功能。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//圖片解析成Bitmap
Bitmap bitmap = null;
Matrix m=new Matrix();
//順時針旋轉90度
m.postRotate(90);
Log.e("111", "onActivityResult:" + uri );
try {
bitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(uri));
int width=bitmap.getWidth();
//取得圖片的長度
int height=bitmap.getHeight();
bitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, m, true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//將照片顯示出來
imageView.setImageBitmap(bitmap);
}